var express = require('express');
var router = express.Router();

const cart = require("../sql/cart")
const sql = require("../sql/sql")
const tools = require("../tools/index")
const pro = require("../sql/pro")
const uuid = require("uuid")

// 购物车
// 增：添加购物车信息
// 删：删除购物车信息
// 改：修改数量，修改商品的选中状态
// 查：获取购物车数据


/**
* @apiGroup 购物车
* @api {get} /api/cart 获取购物车
* @apiVersion 0.0.0
* @apiDescription 获取购物车数据
* @apiSuccess {number} code 请求状态
* @apiSuccess {string} msg 请求说明
* @apiSuccess {array} data 请求数据
* @apiSuccessExample {json} Success-Response:
res.send({
    code:1,
    title:"购物车添加成功",
    data:"NO DATA"
})
res.send({
    code: 400,
    title: "登录失效，请重新登录",
    data: err
})
* @apiSampleRequest http://localhost:3000/api/cart
*/

router.get('/', function(req, res, next) {
    const token = req.headers.token
    tools.verify(token).then(result=>{
        // result.userId
        sql.get(cart, {userId: result.userId}).then(data=>{
            res.send({
                code:1,
                title:"获取成功",
                data:data[0]
            })
        })
    }).catch(err=>{
        res.send({
            code:400,
            title:"登录失效，请重新登录",
            data:err
        })
    })
})


/**
* @apiGroup 购物车
* @api {post} /api/cart/add 添加购物车
* @apiVersion 0.0.0
* @apiDescription 添加商品数据到购物车
* @apiParam {String} proData json格式的商品数据
* @apiSuccess {number} code 请求状态
* @apiSuccess {string} msg 请求说明
* @apiSuccess {array} data 请求数据
* @apiSuccessExample {json} Success-Response:
res.send({
    code:0,
    title:"不存在该商品",
    data:"NO DATA"
})
res.send({
    code:1,
    title:"购物车添加成功",
    data:"NO DATA"
})
res.send({
    code:2,
    title:"更新数据库成功",
    data:"NO DATA"
})
res.send({
    code: 400,
    title: "登录失效，请重新登录",
    data: err
})
* @apiSampleRequest http://localhost:3000/api/cart/add
*/

router.post('/add', function(req, res, next) {
    // 商品数据:{proId:"jahgfaj",propName:"ajsgfa",....,num:3,flag:true}
    let proData = JSON.parse(req.body.proData);
    // token:jahgdjhauatfs(内含userId，但是需要jwt解析)
    let token = req.headers.token;

    // 问题描述：添加购物车时，只能添加最初的一条数据，将来无法修改
    // 问题分析：
        // 1. 登录验证OK，商品是否存在OK，第一次添加购物车OK，
        // 2. 购物车有数据再次添加，有问题
            // 1. 读取原数据OK：console.log(原数据)
            // 2. 在原数据中查找当前商品OK
            // 3. 处理临时商品数据arr，OK：console.log(arr)
            // 4. 将临时数据修改到数据库，有问题
                // 1. 借助sql工具函数OK
                // 2. 集合对象OK
                // 3. 条件OK
                // 4. 修改的购物车数据，有问题
                    // 修改的数据和数据库中的原数据结构是否对应

    // 1. 根据token验证用户登录信息
    tools.verify(token).then(result=>{
        // 3. 验证成功，解析后的token为result
        // 4. 读取商品集合
        sql.get(pro,{ proId: proData.proId }).then(data1=>{
            // 5. 验证商品是否存在：读取pro集合
            if(data1.length > 0){
                // 7. 根据用户id获取购物车数据
                sql.get(cart, { userId: result.userId }).then(data=>{
                    // 8. 判断购物车是否为空
                    if(data.length > 0){
                        // 11. 不为空，判断当前商品是否是重复商品
                        // 将商品数据单独存储
                        const arr = data[0].proData
                        // 用来记录索引
                        let i = 0;
                        // 遍历商品数据，并判断是否重复
                        const flag = arr.some((val,idx)=>{
                            i = idx;
                            return val.proId === proData.proId
                        })
                        // 判断遍历结果
                        if(flag){
                            // 12. 有重复数据，更新指定商品的数量
                            arr[i].num += Number(proData.num)
                        }else{
                            // 13. 没有重复数据，添加数据
                            arr.push(proData)
                        }
                        // 14. 将更新后的数据，插入到数据库集合
                        sql.set(cart, { userId: result.userId }, {$set: {
                            proData: arr,
                            time: Date.now()
                        }}).then(()=>{
                            // 15. 返回提示
                            res.send({
                                code:2,
                                title:"更新数据库成功",
                                data:"NO DATA"
                            })
                        })
                    }else{
                        // 9. 为空，直接将数据存出到集合
                        sql.add(cart, {
                            cartId: "cartId-" + uuid.v1(),
                            userId: result.userId,
                            proData: [proData],
                            time: Date.now()
                        }).then(()=>{
                            // 10. 存储成功后返回提示信息
                            res.send({
                                code:1,
                                title:"购物车添加成功",
                                data:"NO DATA"
                            })
                        })
                    }
                })
            }else{
                // 6. 商品不存在，直接返回提示
                res.send({
                    code:0,
                    title:"不存在该商品",
                    data:"NO DATA"
                })
            }
        })
    }).catch(err=>{
        // 2. 没有登录，直接返回登录失效状态
        res.send({
            code: 400,
            title: "登录失效，请重新登录",
            data: err
        })
    })
});




/**
* @apiGroup 购物车
* @api {post} /api/cart/update/num 商品的数量修改
* @apiVersion 0.0.0
* @apiDescription 商品的数量修改
* @apiParam {String} proId 要修改选中状态的商品id
* @apiParam {String} num 修改后的数量
* @apiSuccess {number} code 请求状态
* @apiSuccess {string} msg 请求说明
* @apiSuccess {array} data 请求数据
* @apiSuccessExample {json} Success-Response:
res.send({
    code:1,
    title:"操作成功",
    data:"NO DATA"
})
res.send({
    code: 400,
    title: "登录失效，请重新登录",
    data: err
})
* @apiSampleRequest http://localhost:3000/api/cart/update/num
*/

// 修改数量
router.post('/update/num', function(req, res, next) {
    let proId = req.body.proId;
    let num = req.body.num;
    let token = req.headers.token;

    tools.verify(token).then(result=>{
        sql.get(cart, {userId: result.userId}).then(data=>{
            // 将商品数据保存成临时数据
            const arr = data[0].proData;
            let i = 0;
            arr.some((val,idx)=>{
                i = idx
                return val.proId === proId
            })
            // 修改临时数据中的数量
            arr[i].num = Number(num)
            // 将修改之后的临时数据，存回数据库
            sql.set(cart, {userId: result.userId}, {$set: {
                proData: arr
            }}).then(()=>{
                res.send({
                    code: 1,
                    title: "修改数量成功",
                    data: "NOT DATA"
                })
            })
        })
    }).catch(err=>{
        res.send({
            code: 400,
            title: "登录失效，请重新登录",
            data: err
        })
    })

})


/**
* @apiGroup 购物车
* @api {post} /api/cart/update/flag 单个商品的状态切换
* @apiVersion 0.0.0
* @apiDescription 单个商品的状态切换
* @apiParam {String} proId 要修改选中状态的商品id
* @apiParam {String} flag 选中状态
* @apiSuccess {number} code 请求状态
* @apiSuccess {string} msg 请求说明
* @apiSuccess {array} data 请求数据
* @apiSuccessExample {json} Success-Response:
res.send({
    code:1,
    title:"操作成功",
    data:"NO DATA"
})
res.send({
    code: 400,
    title: "登录失效，请重新登录",
    data: err
})
* @apiSampleRequest http://localhost:3000/api/cart/update/flag
*/

// 修改选中状态
router.post('/update/flag', function(req, res, next) {
    let proId = req.body.proId;
    let flag = req.body.flag;
    let token = req.headers.token;

    tools.verify(token).then(result=>{
        sql.get(cart, {userId: result.userId}).then(data=>{
            // 将商品数据保存成临时数据
            const arr = data[0].proData;
            let i = 0;
            arr.some((val,idx)=>{
                i = idx
                return val.proId === proId
            })
            // 修改临时数据中的选中状态
            arr[i].flag = Number(flag)
            // 将修改之后的临时数据，存回数据库
            sql.set(cart, {userId: result.userId}, {$set: {
                proData: arr
            }}).then(()=>{
                res.send({
                    code: 1,
                    title: "修改选中状态成功",
                    data: "NOT DATA"
                })
            })
        })
    }).catch(err=>{
        res.send({
            code: 400,
            title: "登录失效，请重新登录",
            data: err
        })
    })
})


/**
* @apiGroup 购物车
* @api {post} /api/cart/update/allflag 全选状态切换
* @apiVersion 0.0.0
* @apiDescription 全选状态切换
* @apiParam {String} flag 选中状态
* @apiSuccess {number} code 请求状态
* @apiSuccess {string} msg 请求说明
* @apiSuccess {array} data 请求数据
* @apiSuccessExample {json} Success-Response:
res.send({
    code:1,
    title:"操作成功",
    data:"NO DATA"
})
res.send({
    code: 400,
    title: "登录失效，请重新登录",
    data: err
})
* @apiSampleRequest http://localhost:3000/api/cart/update/allflag
*/

// 全选修改选中状态
router.post('/update/allflag', function(req, res, next) {
    let flag = req.body.flag;
    let token = req.headers.token;

    tools.verify(token).then(result=>{
        sql.get(cart, {userId: result.userId}).then(data=>{
            // 将商品数据保存成临时数据
            const arr = data[0].proData;
        
            // 修改临时数据中的选中状态
            arr.forEach(val=>{
                val.flag = flag
            })

            // 将修改之后的临时数据，存回数据库
            sql.set(cart, {userId: result.userId}, {$set: {
                proData: arr
            }}).then(()=>{
                res.send({
                    code: 1,
                    title: "全选修改成功",
                    data: "NOT DATA"
                })
            })
        })
    }).catch(err=>{
        res.send({
            code: 400,
            title: "登录失效，请重新登录",
            data: err
        })
    })
})



/**
* @apiGroup 购物车
* @api {post} /api/cart/del 删除购物车
* @apiVersion 0.0.0
* @apiDescription 删除购物车指定数据
* @apiParam {String} proId 要删除的商品id
* @apiSuccess {number} code 请求状态
* @apiSuccess {string} msg 请求说明
* @apiSuccess {array} data 请求数据
* @apiSuccessExample {json} Success-Response:
res.send({
    code:1,
    title:"操作成功",
    data:"NO DATA"
})
res.send({
    code: 400,
    title: "登录失效，请重新登录",
    data: err
})
* @apiSampleRequest http://localhost:3000/api/cart/del
*/

// 删除商品
router.post('/del', function(req, res, next) {
    let proId = req.body.proId;
    let token = req.headers.token;

    tools.verify(token).then(result=>{
        sql.get(cart, {userId: result.userId}).then(data=>{
            // 将商品数据保存成临时数据
            const arr = data[0].proData;
        
            let i = 0;
            arr.some((val,idx)=>{
                i = idx
                return val.proId === proId
            })
            arr.splice(i,1)

            // 将修改之后的临时数据，存回数据库
            sql.set(cart, {userId: result.userId}, {$set: {
                proData: arr
            }}).then(()=>{
                res.send({
                    code: 1,
                    title: "删除成功",
                    data: "NOT DATA"
                })
            })
        })
    }).catch(err=>{
        res.send({
            code: 400,
            title: "登录失效，请重新登录",
            data: err
        })
    })
})


module.exports = router;
